import 'dart:convert';
import 'dart:typed_data';
import 'package:encrypt/encrypt.dart';
import 'dart:developer' as developer;

/// AES加密工具类
/// 
/// 加密规格：
/// - 算法: AES-256-CBC
/// - 密钥: qwertyuiop1234567654zaqwsxcderfv (32字节)
/// - IV: 随机生成16字节
/// - 填充: PKCS7
/// - 编码: Base64
class EncryptionUtil {
  // AES密钥（32字节）
  static const String _secretKey = "qwertyuiop1234567654zaqwsxcderfv";
  
  // 获取加密器实例
  static Encrypter get _encrypter {
    // 使用UTF-8字节直接创建密钥，与MyApplication2保持一致
    final key = Key.fromUtf8(_secretKey);
    return Encrypter(AES(key, mode: AESMode.cbc));
  }
  
  /// AES加密
  /// [data] 待加密的数据（JSON字符串）
  /// 返回Base64编码的加密字符串
  static String aesEncrypt(String data) {
    try {
      developer.log('🔐 开始AES加密');
      developer.log('📝 原始数据: $data');
      
      // 生成随机IV（16字节）
      final iv = IV.fromSecureRandom(16);
      developer.log('🔑 生成的IV: ${iv.base64}');
      
      // 进行加密
      final encrypter = _encrypter;
      final encrypted = encrypter.encrypt(data, iv: iv);
      
      // 将IV和加密数据拼接后进行Base64编码
      final ivBytes = iv.bytes;
      final encryptedBytes = encrypted.bytes;
      final combinedBytes = Uint8List.fromList(ivBytes + encryptedBytes);
      final result = base64Encode(combinedBytes);
      
      developer.log('📦 加密结果长度: ${result.length}');
      developer.log('🔒 加密数据: $result');
      developer.log('✅ AES加密成功');
      
      return result;
    } catch (e) {
      developer.log('❌ AES加密失败: $e');
      throw Exception('AES加密失败: $e');
    }
  }
  
  /// AES解密（用于调试验证）
  /// [encryptedData] Base64编码的加密字符串
  /// 返回解密后的原始数据
  static String aesDecrypt(String encryptedData) {
    try {
      developer.log('🔓 开始AES解密验证');
      developer.log('🔒 加密数据: $encryptedData');
      
      // Base64解码
      final combinedBytes = base64Decode(encryptedData);
      
      // 分离IV和加密数据
      final ivBytes = combinedBytes.sublist(0, 16);
      final encryptedBytes = combinedBytes.sublist(16);
      
      final iv = IV(ivBytes);
      final encrypted = Encrypted(encryptedBytes);
      
      developer.log('🔑 解析的IV: ${iv.base64}');
      
      // 进行解密
      final encrypter = _encrypter;
      final decrypted = encrypter.decrypt(encrypted, iv: iv);
      
      developer.log('📝 解密结果: $decrypted');
      developer.log('✅ AES解密验证成功');
      
      return decrypted;
    } catch (e) {
      developer.log('❌ AES解密验证失败: $e');
      throw Exception('AES解密验证失败: $e');
    }
  }
  
  /// 创建加密载荷
  /// [data] 原始数据Map
  /// 返回包含encrypted_data字段的Map
  static Map<String, dynamic> createEncryptedPayload(Map<String, dynamic> data) {
    try {
      developer.log('📋 创建加密载荷');
      developer.log('📊 原始数据: ${jsonEncode(data)}');
      
      // 创建新的Map，避免修改原始data
      final dataWithTimestamp = Map<String, dynamic>.from(data);
      
      // 添加当前时间戳（根据测试结果，timestamp应该是数字类型）
      final timestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;
      dataWithTimestamp['timestamp'] = timestamp;
      
      developer.log('⏰ 添加时间戳: $timestamp (${timestamp.runtimeType})');
      developer.log('📊 完整数据: ${jsonEncode(dataWithTimestamp)}');
      
      // 转换为JSON字符串
      final jsonData = jsonEncode(dataWithTimestamp);
      
      developer.log('📄 JSON字符串: $jsonData');
      developer.log('📏 JSON长度: ${jsonData.length} 字符');
      
      // 进行AES加密
      final encryptedData = aesEncrypt(jsonData);
      
      // 创建加密载荷
      final payload = {
        'encrypted_data': encryptedData,
      };
      
      developer.log('📦 加密载荷: ${jsonEncode(payload)}');
      
      // 验证解密（调试用）
      try {
        final decryptedVerify = aesDecrypt(encryptedData);
        final isValid = decryptedVerify == jsonData;
        developer.log('🔍 解密验证: ${isValid ? "✅ 成功" : "❌ 失败"}');
        developer.log('📝 实际加密的数据内容: $decryptedVerify');
        
        if (!isValid) {
          developer.log('   期望: $jsonData');
          developer.log('   实际: $decryptedVerify');
        } else {
          // 解析JSON数据查看具体字段
          try {
            final parsedData = jsonDecode(decryptedVerify);
            developer.log('📊 解析后的字段:');
            parsedData.forEach((key, value) {
              developer.log('   - $key: $value (${value.runtimeType})');
            });
          } catch (e) {
            developer.log('⚠️ 解析JSON失败: $e');
          }
        }
      } catch (e) {
        developer.log('⚠️ 解密验证失败，但继续发送请求: $e');
      }
      
      return payload;
    } catch (e, stackTrace) {
      developer.log('❌ 创建加密载荷失败: $e');
      developer.log('📍 错误堆栈: $stackTrace');
      throw Exception('创建加密载荷失败: $e');
    }
  }
  
  /// 验证时间戳是否有效
  /// [timestamp] 时间戳（数字或字符串）
  /// [maxAge] 最大有效期（秒），默认300秒（5分钟）
  static bool isTimestampValid(dynamic timestamp, {int maxAge = 300}) {
    try {
      int timestampInt;
      if (timestamp is int) {
        timestampInt = timestamp;
      } else if (timestamp is String) {
        timestampInt = int.parse(timestamp);
      } else {
        developer.log('❌ 无效的时间戳类型: ${timestamp.runtimeType}');
        return false;
      }
      
      final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
      final timeDiff = (currentTime - timestampInt).abs();
      
      developer.log('⏰ 时间戳验证:');
      developer.log('   - 传入时间戳: $timestamp ($timestampInt)');
      developer.log('   - 当前时间戳: $currentTime');
      developer.log('   - 时间差: ${timeDiff}秒');
      developer.log('   - 最大允许: ${maxAge}秒');
      developer.log('   - 验证结果: ${timeDiff <= maxAge ? "✅ 有效" : "❌ 过期"}');
      
      return timeDiff <= maxAge;
    } catch (e) {
      developer.log('❌ 时间戳验证失败: $e');
      return false;
    }
  }
}
